package com.itany.corejava.code13_jdbc;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author 石小俊
 * @date 2023年05月30日 11:15
 */
public class Test14_dbcp {

    public static void main(String[] args) throws SQLException {
        test02();

    }

    public static void test01() throws SQLException {
        BasicDataSource ds = new BasicDataSource();
        // 配置连接数据库的常用信息
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8");
        ds.setUsername("root");
        ds.setPassword("");

        // 配置初始化连接数:初始化连接池时申请的连接数量
        ds.setInitialSize(1);
        // 最大活跃数:表示最多有多少个连接被使用
        ds.setMaxActive(1);
        // 最大空闲连接数:保证连接池中最多存在多少个空闲的连接数
        ds.setMaxIdle(1);
        // 最小空闲连接数:保证连接池中最少存在多少个空闲的连接数
        // 如果不够可以自动开启,但是不能超出总数
        ds.setMinIdle(1);

        // 设置超时时间,单位毫秒
        // 等待获取连接池中的连接的时间
        // 如果等待的时间超出了超时时间,直接报错
        ds.setMaxWait(3000);

        // 使用
        // 从连接池中获取连接
        Connection conn = ds.getConnection();
        System.out.println(conn);

        // 归还连接
        // 当归还连接后,连接会自动回到连接池中
        // 等待下一个人使用
        conn.close();

        // 当连接都被使用后,此时需要等待其他连接归还
        // 如果一直没有归还,则根据设置的超时时间
        // 超过了超时时间则直接报错
        Connection conn2 = ds.getConnection();
        System.out.println(conn2);
    }

    public static void test02() {
        Properties p = new Properties();
        try {
            p.load(Test14_dbcp.class.getClassLoader().getResourceAsStream("dataSource.properties"));
            System.out.println(p);
            // 在BasicDataSourceFactory中提供了自动设置属性的方法
            // 只要配置文件中读取的所有数据的key与方法中的key一致即可
            DataSource ds = BasicDataSourceFactory.createDataSource(p);
            Connection conn = ds.getConnection();
            System.out.println(conn);
            Connection conn2 = ds.getConnection();
            System.out.println(conn2);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
